import tkinter as tk
from concurrent.futures import ThreadPoolExecutor
import crawling
import createTable
# 弹窗
class MyDialog(tk.Toplevel):
  def __init__(self):
    super().__init__()
    self.title('设置数据库信息')
    # 弹窗界面
    self.setup_UI()
  def setup_UI(self):
    # 第一行（两列）
    row1 = tk.Frame(self)
    row1.pack(fill="x")
    tk.Label(row1, text='地址：', width=20).pack(side=tk.LEFT)
    self.host = tk.StringVar()
    tk.Entry(row1, textvariable=self.host, width=40).pack(side=tk.LEFT)
    
    # 第二行
    row2 = tk.Frame(self)
    row2.pack(fill="x", ipadx=1, ipady=1)
    tk.Label(row2, text='用户名：', width=20).pack(side=tk.LEFT)
    self.user = tk.StringVar()
    tk.Entry(row2, textvariable=self.user, width=40).pack(side=tk.LEFT)

    # 第三行
    row3 = tk.Frame(self)
    row3.pack(fill="x", ipadx=1, ipady=1)
    tk.Label(row3, text='密码：', width=20).pack(side=tk.LEFT)
    self.passwd = tk.StringVar()
    tk.Entry(row3, textvariable=self.passwd, width=40).pack(side=tk.LEFT)

    # 第四行
    row4 = tk.Frame(self)
    row4.pack(fill="x", ipadx=1, ipady=1)
    tk.Label(row4, text='数据库名称：', width=20).pack(side=tk.LEFT)
    self.db = tk.StringVar()
    tk.Entry(row4, textvariable=self.db, width=40).pack(side=tk.LEFT)

    # 第五行
    row5 = tk.Frame(self)
    row5.pack(fill="x", ipadx=1, ipady=1)
    tk.Label(row5, text='表名称：', width=20).pack(side=tk.LEFT)
    self.table = tk.StringVar()
    tk.Entry(row5, textvariable=self.table, width=40).pack(side=tk.LEFT)

    # 第六行
    row3 = tk.Frame(self)
    row3.pack(fill="x")
    tk.Button(row3, text="取消", command=self.cancel).pack(side=tk.RIGHT)
    tk.Button(row3, text="确定", command=self.ok).pack(side=tk.RIGHT)
  def ok(self):
    self.userinfo = [self.host.get(), self.user.get(), self.passwd.get(), self.db.get(), self.table.get()] # 设置数据
    self.destroy() # 销毁窗口
  def cancel(self):
    self.userinfo = None # 空！
    self.destroy()


# 主窗
class MyApp(tk.Tk):
  def __init__(self):
    super().__init__()
    #self.pack() # 若继承 tk.Frame ，此句必须有！
    self.title('用户信息')
    # 程序参数/数据
    self.host = 'localhost'
    self.user = 'root'
    self.passwd = 'root'
    self.db = 'personaldata'
    self.table = 'url'
    # 程序界面
    self.setupUI()
  def setupUI(self):
    # 第一行（两列）
    row1 = tk.Frame(self)
    row1.pack(fill="x")
    tk.Label(row1, text='地址：', width=20).pack(side=tk.LEFT)
    self.l1 = tk.Label(row1, text=self.host, width=40)
    self.l1.pack(side=tk.LEFT)
    # 第二行
    row2 = tk.Frame(self)
    row2.pack(fill="x")
    tk.Label(row2, text='用户名：', width=20).pack(side=tk.LEFT)
    self.l2 = tk.Label(row2, text=self.user, width=40)
    self.l2.pack(side=tk.LEFT)

    # 第三行
    row3 = tk.Frame(self)
    row3.pack(fill="x")
    tk.Label(row3, text='密码：', width=20).pack(side=tk.LEFT)
    self.l3 = tk.Label(row3, text=self.passwd, width=40)
    self.l3.pack(side=tk.LEFT)

    # 第四行
    row4 = tk.Frame(self)
    row4.pack(fill="x")
    tk.Label(row4, text='数据库名称：', width=20).pack(side=tk.LEFT)
    self.l4 = tk.Label(row4, text=self.db, width=40)
    self.l4.pack(side=tk.LEFT)

    # 第五行
    row5 = tk.Frame(self)
    row5.pack(fill="x")
    tk.Label(row5, text='表名称：', width=20).pack(side=tk.LEFT)
    self.l5 = tk.Label(row5, text=self.table, width=40)
    self.l5.pack(side=tk.LEFT)

    # 第五行
    row9 = tk.Frame(self)
    row9.pack(fill="x")
    tk.Label(row9, text='爬取范围(页数)', width=20).pack(side=tk.LEFT)
    tk.Label(row9, text='开始', width=0).pack(side=tk.LEFT)
    self.no = tk.IntVar()
    tk.Entry(row9,textvariable=self.no, width=10).pack(side=tk.LEFT)
    tk.Label(row9, text='--', width=0).pack(side=tk.LEFT)
    self.size = tk.IntVar()
    tk.Entry(row9,textvariable=self.size, width=10).pack(side=tk.LEFT)
    tk.Label(row9, text='结束', width=0).pack(side=tk.LEFT)
    
    row10 = tk.Frame(self)
    row10.pack(fill="x")
    tk.Label(row10, text='返回结果:', width=20).pack(side=tk.LEFT)
    self.l10=tk.Text(row10,height=2)
    self.l10.pack(side=tk.LEFT)

    # 第六行
    row6 = tk.Frame(self)
    row6.pack(fill="x")
    tk.Button(row6, text="创建数据库", command=self.create_Table).pack(side=tk.RIGHT)

    # 第七行
    row7 = tk.Frame(self)
    row7.pack(fill="x")
    tk.Button(row7, text="确认数据库信息", command=self.setup_config).pack(side=tk.RIGHT)

    # 第八行
    row8 = tk.Frame(self)
    row8.pack(fill="x")
    tk.Button(row8, text="开始爬取数据", command=self.setup_start).pack(side=tk.RIGHT)     
  # 创建数据库
  def create_Table(self):
    r=createTable.login(self.host,self.user,self.passwd,self.db,self.table)
    self.l10.insert(1.0,r)

  # 开始爬取
  def setup_start(self):
      arr=[]
      for i in range(self.no.get(),self.size.get()):
          arr.append(i)
      executor=ThreadPoolExecutor(5)
      for each in arr:
          executor.submit(crawling.getData_start,self,each)

  # 设置参数
  def setup_config(self):
    # 接收弹窗的数据
    res = self.ask_userinfo()
    #print(res)
    if res is None: return
    # 更改参数
    self.host, self.user, self.passwd, self.db, self.table = res
    # 更新界面
    self.l1.config(text=self.host)
    self.l2.config(text=self.user)
    self.l3.config(text=self.passwd)
    self.l4.config(text=self.db)
    self.l5.config(text=self.table)
  # 弹窗
  def ask_userinfo(self):
    inputDialog = MyDialog()
    self.wait_window(inputDialog) # 这一句很重要！！！
    return inputDialog.userinfo

if __name__ == '__main__':
  app = MyApp()
  app.mainloop()

